#导入模块
import pygame
import sys
import game_map
import hero_plane
import enemy_plane
import game_score

IMAGE_PATH = "D:\\MyLinux\\Ubuntu\\Sharedfiles\\3Linux\\19-LV19\\day3\\res\\"

# 自定义一个游戏窗口管理类
class GameWindow(object):
    # 构造方法
    def __init__(self, winWidth = 512, winHeight = 768):
        self.width = winWidth;
        self.height = winHeight;
        # 对pygame 进行实例化, 叫做硬件准备
        pygame.init()

        # 创立窗口  set_mode([400,400])
        self.window = pygame.display.set_mode([self.width, self.height])

        pygame.display.set_caption("飞机大战") # 设置游戏窗口的标题
        # pygame.mixer.music.load(IMAGE_PATH + "bg2.ogg") # 加载背景音乐
        # pygame.mixer.music.play(-1) # 循环播放背景音乐
        self.boom_sound = pygame.mixer.Sound(IMAGE_PATH + "baozha.ogg") # 加载音效

        self.app_logo = pygame.image.load(IMAGE_PATH + "app.ico") # 加载本地资源图片
        pygame.display.set_icon(self.app_logo) # 设置游戏窗口logo

        self.map = game_map.GameMap()            # 地图对象
        self.hero_plane = hero_plane.HeroPlane() # 英雄飞机对象
        self.enemy_list = [enemy_plane.EnemyPlane() for i in range(6)] # 多架敌机
        self.game_score = game_score.GameScore(35) # 游戏分数
    # 运行游戏程序
    def run(self):
        while True:
            self.__action()
            self.__draw()
            self.__event()
            self.__update()
            self.__bullet_hit_enemy()

    # 1.处理各种矩形坐标移动
    def __action(self):
        # 地图动画
        self.map.move_down() 
        # 遍历子弹 叫子弹飞一会
        for bullet in self.hero_plane.bullet_list:
            if bullet.is_shot: # 判断如果已经发射
                bullet.move_up()
        # 敌机下落
        for enemy in self.enemy_list:
            enemy.move_down()

    # 2.根据矩形坐标，重新对元素进行绘制
    def __draw(self):
        # 添加地图图片
        self.window.blit(self.map.img_1, (0, self.map.img1_y))
        self.window.blit(self.map.img_2, (0, self.map.img2_y))
        # 飞机图片
        self.window.blit(self.hero_plane.img, (self.hero_plane.img_rect[0], self.hero_plane.img_rect[1]))
        # 添加子弹
        for bullet in self.hero_plane.bullet_list:
            if bullet.is_shot: # 判断如果已经发射的子弹
                self.window.blit(bullet.img, (bullet.img_rect[0], bullet.img_rect[1]))
        # 添加敌机
        for enemy in self.enemy_list:
            self.window.blit(enemy.img, (enemy.img_rect[0], enemy.img_rect[1]))
        # 添加文字
        self.window.blit(self.game_score.text_obj, (10, 10))

    # 3.处理窗口中的监听事件
    def __event(self):
        # 获取所有游戏窗口的中的事件监听-> 列表
        event_list = pygame.event.get()
        # 遍历所有的事件
        for event in event_list:
            # 判断如果是鼠标点击了
            if event.type == pygame.QUIT:
                self.game_over()

            # 监听esc键按下
            if event.type == pygame.KEYDOWN:
                
                if event.key == pygame.K_ESCAPE: # 判断是否按得是esc
                    self.game_over()
                
                if event.key == pygame.K_SPACE: # 判断是否按得是空格
                    self.hero_plane.shot()

        # 监听键盘中的按键长按-> 元组(只有两种情况 0 或者 1) -> ASCII
        pressed_keys = pygame.key.get_pressed()
        # 判断向上的按键是否在长按(1)
        if pressed_keys[pygame.K_UP] or pressed_keys[pygame.K_w]:
            self.hero_plane.move_up()

        # 判断向下的按键是否在长按(1)
        if pressed_keys[pygame.K_DOWN] or pressed_keys[pygame.K_s]:
            self.hero_plane.move_down()

        # 判断向左的按键是否在长按(1)
        if pressed_keys[pygame.K_LEFT] or pressed_keys[pygame.K_a]:
            self.hero_plane.move_left()

        # 判断向右的按键是否在长按(1)
        if pressed_keys[pygame.K_RIGHT] or pressed_keys[pygame.K_d]:
            self.hero_plane.move_right()

    # 4.刷新窗口
    def __update(self):
        pygame.display.update()
    # 5.结束游戏
    def game_over(self):
        
        self.boom_sound.stop()     # 停止音效
        # pygame.mixer.music.stop() # 停止背景音乐

        # 退出游戏
        pygame.quit() # 停止pygame 游戏引擎
        sys.exit()    # 退出程序
    # 6.碰撞检测(子弹和敌机碰撞)
    def __bullet_hit_enemy(self):
        # 判断
        # 遍历子弹
        for bullet in self.hero_plane.bullet_list:
            # 判断子弹发射
            if bullet.is_shot:
                # 遍历敌机
                for enemy in self.enemy_list:
                    # 判断两个矩形是否相交，相交返回True，否则返回False
                    flag = pygame.Rect.colliderect(bullet.img_rect, enemy.img_rect)
                    if flag:
                         # 子弹
                        bullet.is_shot = False
                        # 敌机
                        enemy.reset()
                        # 播放音效
                        self.boom_sound.play()

                        # 设置分数
                        self.game_score.set_text_obj()
# 主函数
def main():
    game_window = GameWindow() # 创建一个游戏窗口对象
    game_window.run() # 执行游戏

if __name__ == '__main__':
    main()